


//===== 公共变量
var after_url = 'interface.php';
//var upyun_url = 'http://shop-cache-upyun.bm123.top';
var upyun_shop_img = 'http://tp-shop-img.bm123.top';
var upyun_shop_cache = 'http://tp-shop-cache.bm123.top';
//var base_img = 'http://www.tools.top/image/base.png';
var base_img = '../Public/Image/base.png';








//===== 项目特定函数区










/*
	### 跳转到错误页
	参一：string  页面url附带错误代号
	示例：
		JumpError('../error.html?t=400012');	//400012 获取状态集合失败
*/
function JumpError(url){
	location.replace(url);
	exit;
}




/*
	### 检测状态集合中指定字段是否过期
	参一：object    状态集合对象
	参二：string    要检测的字段名
	参三：int       本地缓存的过期时间
	return：        未过期返回ok,过期返回err
	示例：
		StatusSetObj = JSON.parse(StatusSet);
		var CheckName = 'city_open';
		var le = localStorage.OpenCityExpire;
		var res = CheckStatusIsExpire(StatusSetObj,CheckName,le);
		if(res == 'err'){
			localStorage.OpenCity = '';
		}
		CityInit(OpenCityObj,Province,City,County,function(){},12342349);
*/
function CheckStatusIsExpire(StatusSetObj,CheckName,LocalExpire){
	var OpenCityStatus = GetStatusSetField(StatusSetObj,CheckName); //获取状态集合中指定字段
	//对比状态字段时间与本地缓存时间，按需清除
	if((OpenCityStatus && !LocalExpire) || (OpenCityStatus && LocalExpire && parseInt(OpenCityStatus)*1000) > parseInt(LocalExpire)){
		return 'err';
	}
	return 'ok';
	function GetStatusSetField(StatusSetObj,CheckName){
		var val = '';
		for(var i in StatusSetObj){
			if(i == CheckName){
				val = StatusSetObj[i];
				break;
			}
		}
		return val;
	}
}



/*
	### 从localStorage，upyun获取状态集合，并定期更新
	参一：回调  成功返回数据，失败返回 err
*/
function GetStatusSet(fun){
	if(localStorage.StatusSetExpire && parseInt(localStorage.StatusSetExpire) > new Date().getTime() - 3000){
		C('StatusSet_localStorage');
		if(fun){
			fun(localStorage.StatusSet);
		}
	}else{
		var StatusSetUrl = upyun_shop_cache + '/Status/StatusSet.html';
		UrlIsActive(StatusSetUrl,function(s){
			if(s){
				CorsQuery(StatusSetUrl,'',function(res){
					if(res && res != 'err'){
						C('StatusSet_Upyun');
						localStorage.StatusSet = JSON.stringify(res);
						localStorage.StatusSetExpire = new Date().getTime();
						if(fun){
							fun(localStorage.StatusSet);
						}
					}else{
						if(fun){
							fun('err');	//获取状态集合失败
						}
						
					}
				});
			}else{
				if(fun){
					fun('err');	//获取状态集合失败
				}
				
			}
		});
	}
}




/*
	### 解析城市数据到元素
	参一：object         城市全部数据对象
	参二：object         已开通城市数据对象
	参三：int            返回城市数据类型，1：全部，2：已开通，3：未开通
	参四：object 	     省select对象
	参五：object 	     市select对象
	参六：object 	     县select对象
	参七：function       完成后的回调
	示例：
		City_ParseCity(CityFull,CityOpen,GetOpenType(),MainCounty_Province,MainCounty_City,MainCounty_County,function(){
							MainCounty_ViewDbInfoForCounty();
						});
*/
function City_ParseCity(CityInfo,OpenInfo,stat,ele_province,ele_city,ele_county,fun){
	ele_county.innerHTML = '';
	ele_province.innerHTML='';
	ele_city.innerHTML = '';

	var Province_Arr = [];
	var City_Arr = [];
	var County_Arr = [];	//用来装载省市县分类后的城市数据

	var Province_Arr2 = new Array();	
	var City_Arr2 = new Array();
	var County_Arr2 = new Array();	//用来装载筛选后的城市数据
	LoadCityInfo();
  	function LoadCityInfo(){
		for(var i=0;i<CityInfo.length;i++){
			//过滤掉港奥台
			if(CityInfo[i].level == 0){
				if(CityInfo[i].code == 710000 || CityInfo[i].code == 810000 || CityInfo[i].code == 820000){
					continue;
				}
			}
			if(CityInfo[i].level == 0){			//归集省数据
				Province_Arr2.push(CityInfo[i]);
			}
			if(CityInfo[i].level == 1){			//归集市数据
				City_Arr2.push(CityInfo[i]);
			}
			if(CityInfo[i].level == 2){			//归集县数据
				if(stat == 2){	//如果是获取已开通城市信息
					continue;
				}else if(stat == 3){	//如果是获取未开通城市信息
					var tmp_stat = true;
					for(var j=0;j<OpenInfo.length;j++){
						if(OpenInfo[j].id == CityInfo[i].id){
							tmp_stat = false;
						}
					}
					if(tmp_stat){
						County_Arr2.push(CityInfo[i]);
					}
				}else if(stat == 1){
					CityInfo[i].db_host = '';
					CityInfo[i].db_name = '';
					for(var j=0;j<OpenInfo.length;j++){
						if(CityInfo[i].id == OpenInfo[j].id){
							CityInfo[i].db_host = OpenInfo[j].db_host;
							CityInfo[i].db_name = OpenInfo[j].db_name;
						}
					}
					County_Arr2.push(CityInfo[i]);
				}
				
			}
		}
		if(stat == 2){	//如果是获取已开通城市信息,则直接将开通的数据赋值
			County_Arr2 = OpenInfo;
		}


		//获取县对应的市id，并装载县数据
		var city_id = new Array();
		for(var i=0;i<County_Arr2.length;i++){
			if(stat == 2){
				if(County_Arr2[i].level==2 && County_Arr2[i].db_host.length > 0 && County_Arr2[i].db_name.length > 0){
					city_id.push(parseInt(County_Arr2[i].parent_id)); //将市id记住
					County_Arr.push(County_Arr2[i]);	//将县数据装入县信息
				}
			}
			if(stat == 3){
				if(County_Arr2[i].level==2 && County_Arr2[i].db_host =='' && County_Arr2[i].db_name == ''){
					city_id.push(parseInt(County_Arr2[i].parent_id)); //将市id记住
					County_Arr.push(County_Arr2[i]);	//将县数据装入县信息
				}
			}

		}
		if(stat == 1){	//获取全部数据
			Province_Arr = Province_Arr2;
			City_Arr = City_Arr2;
			County_Arr = County_Arr2;

		}else{
			if(County_Arr.length < 1){
				return;
			}
			//获取市对应的省id，并装载市数据
			var province_id = new Array();
			for(var i=0;i<City_Arr2.length;i++){
				var a = city_id.indexOf(parseInt(City_Arr2[i].id));
				if(a >= 0){
					province_id.push(parseInt(City_Arr2[i].parent_id));	//将省id记住
					City_Arr.push(City_Arr2[i]);		//将市数据装入县信息
				}
			}	
			//装载省数据
			for(var i=0;i<Province_Arr2.length;i++){
				var a = province_id.indexOf(parseInt(Province_Arr2[i].id));
				if(a >= 0){
					Province_Arr.push(Province_Arr2[i]);		//将市数据装入县信息
				}
			}
		}
		PushProvince(); //填充省市县数据
  	}

 	//填充省数据
	function PushProvince(){
		ele_province.innerHTML = ''
		var Province_Str = '';
		for(var i=0;i<Province_Arr.length;i++){
			Province_Str += "<option value="+Province_Arr[i].id+">"+Province_Arr[i].name+"</option>";
		}
		ele_province.innerHTML=Province_Str;
		PushCity();		//直充市数据
	}
	//填充市数据
	function PushCity(){
		ele_city.innerHTML = '';
		var Province_Id = ele_province.options[ele_province.selectedIndex].value;
		var City_Str = '';
		for(var i=0;i<City_Arr.length;i++){
			if(City_Arr[i].parent_id == Province_Id){
				City_Str += "<option value="+City_Arr[i].id+">"+City_Arr[i].name+"</option>";
			}
		}
		ele_city.innerHTML = City_Str;
		PushCounty();	//填充县数据
	}
	//填充县数据
	function PushCounty(){
		ele_county.innerHTML = '';
		var City_Id = ele_city.options[ele_city.selectedIndex].value;
		var County_Str = '';
		for(var i=0;i<County_Arr.length;i++){
			if(County_Arr[i].parent_id == City_Id){
				County_Str += "<option value="+County_Arr[i].code+","+County_Arr[i].db_host+","+County_Arr[i].db_name+">"+County_Arr[i].name+"</option>";
			}
		}
		ele_county.innerHTML = County_Str;
		if(fun){
			fun();
		}
	}
	//省的切换事件
	ele_province.onchange = function(){
		PushCity(); 	//直充市数据
	}
	//市的切换事件
	ele_city.onchange = function(){
		PushCounty(); 	//直充市数据
	}
	//县的切换
	ele_county.onchange = function(){
		if(fun){
			fun();
		}
	}
}




/*
	### 从localStorage，upyun获取商品分类列表
	参一：回调，成功返回数据，失败返回 err
*/
function GetGoodsType(fun){
	if(localStorage.GoodsType && /^\[{"id":.*}\]$/.test(localStorage.GoodsType)){
		C('GoodsType_localStorage');
		fun(localStorage.GoodsType);
	}else{
		var GoodsTypeUrl = upyun_shop_cache + '/GoodsType/goods_type_list.html';
		UrlIsActive(GoodsTypeUrl,function(s){
			if(s){
				CorsQuery(GoodsTypeUrl,'',function(res){
					if(res && res != 'err'){
						C('GoodsType_Upyun');
						var res2 = JSON.stringify(res);
						if(/^\[{"id":.*$/.test(res2)){
							localStorage.GoodsType = res2;
							localStorage.GoodsTypeExpire = new Date().getTime();
							if(fun){
								fun(localStorage.GoodsType);
							}
						}else{
							if(fun){
								fun('err'); //获取状态集合失败
							}
						}
					}else{
						if(fun){
							fun('err');	//获取状态集合失败
						}
					}
				},2000);
			}else{
				if(fun){
					fun('err'); //获取状态集合失败
				}
			}
		});
	}
}



/*
	### 将商品分类数据解析填充到元素
	参一：string    商品数据的json字串
	参二：string	一级商品分类select 元素id名
	参三：stirng	二级商品分类select 元素id名
	参四：stirng	三级商品分类select 元素id名
*/
function GoodsTypeInit(GoodsTypeStr,st1,st2,st3){
	var t1 = new Array();
	var t2 = new Array();
	var t3 = new Array();
	if(!/^\[{"id":.*$/.test(GoodsTypeStr)){
		C('数据异常！');
		return;
	}
	GCA_ParseData(GoodsTypeStr,function(){ 	//解析合成商品分类数据到一个变量中
		$(st1).change(function(){
			GCA_ParseData_Type2();
		});
		$(st2).change(function(){
			GCA_ParseData_Type3();
		});

	});


	//获取商品列表数据
	function GCA_GetGoodTypes(fun){
		Ajax2({type:'GetGoodTypes'},function(res){
			fun(res);
		},after_url);
	}

	//分解数据并填充到三个下拉框中
	function GCA_ParseData(res,fun){
		var data = JSON.parse(res);
		for(var i=0;i<data.length;i++){
			if(data[i].name == '全部'){
				continue;
			}
			if(data[i].level == 1){
				t1.push(data[i]);
			}
			if(data[i].level == 2){
				t2.push(data[i]);
			}
			if(data[i].level == 3){
				t3.push(data[i]);
			}
		}

		GCA_ParseData_Type1();	//解析一级目录
		fun();
	}


	//解析一级目录
	function GCA_ParseData_Type1(){
		var t1_str = '';
		for(var i=0;i<t1.length;i++){
			t1_str += "<option value='"+t1[i].id+"'>"+t1[i].name+"</option>";
		}
		$(st1).html(t1_str);

		GCA_ParseData_Type2();
	}

	//解析二级目录
	function GCA_ParseData_Type2(){
		var t1_id = $(st1).find('option:selected').val();
		var t2_str = '';
		for(var i=0;i<t2.length;i++){
			if(t1_id == t2[i].parent_id){
				t2_str += "<option value='"+t2[i].id+"'>"+t2[i].name+"</option>";
			}
		}
		$(st2).html(t2_str);

		GCA_ParseData_Type3();
	}

	//解析三级目录
	function GCA_ParseData_Type3(){
		var t2_id = $(st2).find('option:selected').val();
		var t3_str = '';
		for(var i=0;i<t3.length;i++){
			if(t2_id == t3[i].parent_id){
				t3_str += "<option value='"+t3[i].id+"'>"+t3[i].name+"</option>";
			}
		}
		$(st3).html(t3_str);
	}
}





/*
	### 获取已开通城市信息并填充到元素
	参一：object 保存城市数据的容器
	参二：string 省元素id名
	参三：string 市元素id名
	参四：string 县元素id名
	参五：function 回调
	示例：
		CityInit(OpenCityObj,Login_Province,Login_City,Login_County);
*/
function CityInit(OpenCityObj,Login_Province,Login_City,Login_County,fun){
	if(localStorage.OpenCity){
		C('OpenCity_LocalStorage');
		OpenCityObj = JSON.parse(localStorage.OpenCity);
		FillCityInfo(OpenCityObj,Login_Province,Login_City,Login_County,fun);
	}else{
		var OpenCityUrl = upyun_shop_cache + '/CityInfo/city_open.html';
		UrlIsActive(OpenCityUrl,function(s){
			if(s){
				CorsQuery(OpenCityUrl,"Gets",function(res){
					C(res);
					C('OpenCity_Upyun');
					OpenCityObj = res;
					if(!OpenCityObj.county){
						C('获取已开通城市信息失败');
						//JumpError('../error.html?t=400011'); //400011 获取已开通城市信息失败
						exit;
					}
					localStorage.OpenCity = JSON.stringify(res);
					localStorage.OpenCityExpire = new Date().getTime();
					FillCityInfo(OpenCityObj,Login_Province,Login_City,Login_County,fun);
				},2000);
			}else{
				//获取已开通城市信息失败
				C('获取已开通城市信息失败');
				//location.replace('../error.html?t=400011');	
			}
		});
	}
}


/*
	### 填充城市数据到元素
	参一：object 城市数据对象
	参二：string 省元素id名
	参三：string 市元素id名
	参四：string 县元素id名
	参五：function 回调
*/
function FillCityInfo(CityInfo,ele_province,ele_city,ele_county,fun){
	ele_county.innerHTML = '';
	ele_province.innerHTML='';
	ele_city.innerHTML = '';
	var Province_Arr = CityInfo.province;
	var City_Arr = CityInfo.city;
	var County_Arr = CityInfo.county;	//用来装载省市县分类后的城市数据

	PushProvince();

 	//填充省数据
	function PushProvince(){
		ele_province.innerHTML = ''
		var Province_Str = '';
		for(var i=0;i<Province_Arr.length;i++){
			Province_Str += "<option value="+Province_Arr[i].id+">"+Province_Arr[i].name+"</option>";
		}
		ele_province.innerHTML=Province_Str;
		PushCity();		//直充市数据
	}
	//填充市数据
	function PushCity(){
		ele_city.innerHTML = '';
		var Province_Id = ele_province.options[ele_province.selectedIndex].value;
		var City_Str = '';
		for(var i=0;i<City_Arr.length;i++){
			if(City_Arr[i].parent_id == Province_Id){
				City_Str += "<option value="+City_Arr[i].id+">"+City_Arr[i].name+"</option>";
			}
		}
		ele_city.innerHTML = City_Str;
		PushCounty();	//填充县数据
	}
	//填充县数据
	function PushCounty(){
		ele_county.innerHTML = '';
		var City_Id = ele_city.options[ele_city.selectedIndex].value;
		var County_Str = '';
		for(var i=0;i<County_Arr.length;i++){
			if(County_Arr[i].parent_id == City_Id){
				County_Str += "<option value="+County_Arr[i].code+","+County_Arr[i].db_host+","+County_Arr[i].db_name+">"+County_Arr[i].name+"</option>";
			}
		}
		ele_county.innerHTML = County_Str;
		if(fun){
			fun();
		}
	}
	//省的切换事件
	ele_province.onchange = function(){
		PushCity(); 	//直充市数据
	}
	//市的切换事件
	ele_city.onchange = function(){
		PushCounty(); 	//直充市数据
	}
	//县的切换
	ele_county.onchange = function(){
		if(fun){
			fun();
		}
	}
}





/*
	### 解析并显示库址和库名
	参一：object         县select元素id对象
	参二：object         库址input元素id对象
	参三：object         库名input元素id对象
*/
function MainCounty_ViewDbInfoForCounty(MainCounty_County,MainCounty_DbHost,MainCounty_DbName){
	//先清空库址库名input
	MainCounty_DbHost.value = '';
	MainCounty_DbName.value = '';
	var MainCountry_CountVal = MainCounty_County.options[MainCounty_County.selectedIndex].value;
	var MainCountry_CountValArr = MainCountry_CountVal.split(',');
	if(MainCountry_CountValArr.length < 2){
		return;
	}
	sessionStorage.MainCounty_Code = MainCountry_CountValArr[0];
	var data = {
		type:'DecryptIp',
		ip:MainCountry_CountValArr[1]
	};
	Ajax2(data,function(res){
		if(res && res != 'err'){
			MainCounty_DbHost.value = res;
		}
	},after_url);
	sessionStorage.MainCounty_Code = MainCountry_CountValArr[0];
	sessionStorage.MainCounty_DbHost = MainCountry_CountValArr[1];
	MainCounty_DbName.value = MainCountry_CountValArr[2]
	sessionStorage.MainCounty_DbName = MainCountry_CountValArr[2];
}








/*
	### 附带token的 jquery异步加载
	参一：对象方式的请求数据 
	参二：回调
	参三：请求地址
	参四：是否异步.默认无值为异步，有值时为同步
	参五：提交方式 默认均值为post，有值为get
	示例：
		var data = {
			type:'GetServerAddrList',
		}
		Ajax2(data,function(res){
			C(res);
		},'store_interface.php');
*/
function Ajax2(data,fun,url,async,method){
	GetToken(data.type,url,function(t){
		data.token = t;
		data.token_name = data.type;
		Ajax(data,function(res){
			fun(res);
		},url,async,method);
	});
}
function GetToken(token_name,url,fun){
	var data = {
		type:'token',
		token_name:token_name
	}
	Ajax(data,function(t){
		fun(t);
	},url,1,1);
}





/*
	### 附带token的 JS异步加载 (该方式只支持POST异步请求，可上传文件)
	参一：formData数据对象
	参二：请求地址
	参三：回调
	示例：
		Ajax_FormData2(formData,after_url,function(res){
			C(res);
		});
*/
function Ajax_FormData2(formData,after_url,fun){
	GetToken_Js(formData,after_url,function(t){
		formData.append('token',t); 
		Ajax_FormData(formData,after_url,function(res){
			fun(res);return;
		},false,true);
	});
}

function GetToken_Js(formData,after_url,fun){
	var f_tk = new FormData();
	f_tk.append('type','token');
	f_tk.append('token_name',formData.get('type'));
	Ajax_FormData(f_tk,after_url,function(t){
		fun(t);
	},false,true);
}















































//==== 公共函数区



//检测是否为微信浏览器
function IsWxWeb(){
	if(navigator.userAgent.match('(micromessenger)|(MicroMessenger)')){
		return true;
	}else{
		return false;
	}
}





/*
	### JS版获取微信openid
	return  返回微信用户的openid 或跳转到错误页
	示例：
		var openid = JsGetOpenid();
*/
function JsGetOpenid(){
	//是微信浏览器，则获取微信openid
	if(navigator.userAgent.match('(micromessenger)|(MicroMessenger)')){
		var back_uri = encodeURIComponent(document.URL);	//获取当前页面url
		if(GetUrlParm('get_openid_res')){
			var res = GetUrlParm('get_openid_res');
			if(res && /^{.*}$/.test(res)){
				var res2 = JSON.parse(decodeURIComponent(res));
				return res2.openid;	//获取到openid
			}else{
				location.replace('error.html');	//不是微信浏览器跳转到错误页
			}
		}else{
			//跳转到腾讯接口
			location.href='http://tools.bm123.top/wx_login/wx_js.php?get_openid_back_uri='+back_uri+'&t=t';
		}
	}else{
		location.replace('error.html?t=2');	//不是微信浏览器跳转到错误页
	}
}









/*
	### 跨域请求
	参一：string 	请求url
	参二：string 	回调函数名
	参三：function 	成功返回数据，失败返回 err
	参四：int 		超时，默认500毫秒
	示例：
		var url = 'http://www.t2.top/domain.php';
		CorsQuery(url,"JumpDomain",function(res){
			console.log(res);
		},2000);

		domain.php页面
		JumpDomain('http://www.t2.top/domain.html')
*/
function CorsQuery(url,CallBackName,fun,time){
	if(!CallBackName){
		var CallBackName = 'Gets';
	}
	var stat = false;
	$.ajax({
	  url:url,
	  dataType:"jsonp",
	  jsonpCallback:CallBackName, //指定异域使用的函数名为aabbcc
	  success:function(res){
	  	stat = true;
	  	fun(res);
	  }
	});
	var time = parseInt(time) > 0?parseInt(time):500;
	setTimeout(function(){
		if(!stat){
			fun('err');
		}
	},time);
}



/*
	### 处理跨域请求返回数据(去除头尾，返回json字串)
*/
function CorsBackTrim(res){
	var start = res.indexOf('(')+1;
	var end = res.lastIndexOf(')');
	return res.substring(start,end);
}





	
/*
	### 判断远程url是否可用
	参一：请求的url
	参二：回调
	参三：超时，默认1000毫秒
	示例：
		UrlIsActive(url,function(s){
			C(s);
		});
*/
function UrlIsActive(url,fun,timeout){
	if(!timeout){
		var timeout = 1000;
	}
	var ping_stat = false;
	if(window.XMLHttpRequest){
	  var ajax=new XMLHttpRequest();
	}else{
	  var ajax=new ActiveXObject("Microsoft.XMLHTTP");
	}
	ajax.open('GET',url,1);
	ajax.send();
	ajax.onreadystatechange = function(){
		if(ajax.readyState == 4 && ajax.status == 200){
			ping_stat = true;
			fun(ping_stat);
		}
	}
	setTimeout(function(){
		if(!ping_stat){
			fun(ping_stat);
		}
	},timeout);
}








/*
	### 检测文件是否合法(大小，后缀) 
		参一：文件对象(必选)
		参二：文件大小(可选，默认500Kb)
		参三：文件后缀(可选，默认jpg,png,gif)
		return: 
			e1	文件类型不正确（参三使用默认时会检测文件类型)
			e2	文件大小超限
			e3	文件后缀不合法
			true 	通过检测返回true
		示例：
			img_select.onchange=function(){
				var file = img_select.files[0];
				alert(CheckFile(file,50000,['txt','zip']));
			}
*/
function CheckFile(file,size,file_exts){
	if(!size){
		var size = 500000;
	}
	if(!file_exts){
		var file_types = ['image/gif','image/jpeg','image/png'];	//文件类型过滤
		var file_exts = ['gif','GIF','jpeg','JPEG','jpg','JPG','png','PNG'];	//文件后缀过滤
		if(file_types.indexOf(file.type) < 0){
			return 'e1';
		}
	}
	if(file.size > size){
		return 'e2';
	}
	var ext = file.name.substring(file.name.lastIndexOf('.')+1);
	if(file_exts.indexOf(ext) < 0){
		return 'e3';
	}
	return true;
}












/*
	### 对操作进行确认
	参一：设定的操作码 ，默认为123
	说明：操作需要得到确认且输入操作码要与指定的操作码一致才可后续执行。
	示例：
		CheckControl();
		CheckControl(222);

*/
function CheckControl(pwd){
	if(!confirm('确认该操作?')){
		exit;
	}
	if(!pwd){
		var pwd = 123;
	}
	if(prompt('输入操作码！') != pwd){
		A('操作码不正确!');
		exit;
	}
}







/*
	### 获取当前cookie中指定字段的值
	### 参一：想要获取的字段名 如：uid
	### return: 成功：反回对应字段的cookie值，失败返回 err
	### 示例：
		当前页面cookie : a=aaa; b=bbb; c=ccc
		var key='b';
		alert(GetCookie(key));	//结果： bbb
*/
function GetCookie(key){
	//var p = '/'+key+'=([^;]*)?/';
	var p = '/^'+key+'=([^;]*)?| '+key+'=([^;]*)?/';
	if(res = document.cookie.match(eval(p))){
		//return res[1];
		if(res[1]){
			return res[1];
		}else{
			return res[2];
		}
	}else{
		return false;
	}
}






/*
	### 获取GET附带参数
	参一：key (string) GET传参的参名
	return 	成功返回参名对应的值，失败返回false
*/
function GetUrlParm(key){
	var p = '/'+key+'=([^&]*)/';
	if(res = document.URL.match(eval(p))){
		if(res[1]){
			return res[1];
		}else{
			return false;
		}
	}else{
		return false;
	}
}






/*
	### 蒙板提示框(提示时页面被盖不可操作)
	### 参一：提示内容
	### 需要：函数需要一个 id='notice' 的元素做容器
	### 示例：
		 <div id='Notice'></div>
		 Notice('信息发布成功！'); //开启提示框
		 Notice();	//关闭提示框
*/
var Notice_deg = 1;
var Notice_rotate;
function Notice(text){
	if(text){
		var str = "<div class='sca_Notice' style='z-index:100;position:fixed;top:0px;width:100%;height:100%;background:rgba(255,100,100,0.5)'><div id='notice_text' style='background:#fff;width:200px;margin:20% auto;text-align:center;padding:30px;border-radius:10px'><div class='sca_Notice_img' style='padding:10px;border-top:1px solid #bbb;border-right:1px solid #999;border-bottom:1px solid #666;display:inline-block;border-radius:25px'></div><div>"+text+"</div></div></div>";
		$('body').append(str);
		Notice_rotate = setInterval(function(){
			$(".sca_Notice_img").css({'transform':'rotate('+Notice_deg+'deg)'});
			Notice_deg +=25;
		},100)
	}else{
		//$('.sca_Notice').html('');
		$('.sca_Notice').remove();
		clearInterval(Notice_rotate);	
	}
}









/*
	### 点击切换验证码
	参一：图片元素对象
	参二：图片切换的时间延迟
	示例：
		<img src="xx.php?type=code" onclick='ChangeCode(this,2000)'>

*/
function ChangeCode(o,time){
	if(!time){
		var time = 1000;	
	}
	if(parseInt(sessionStorage.code_time)+time > new Date().getTime()){
		return;
	}
	var src = o.src+'&m='+Math.random();
	o.src = src;
	sessionStorage.code_time = new Date().getTime();
}



	






	
/*
	### 检测字段
	示例：
		Field_Check(/^.{3,20}$/,StoreMainEdit_Name,'js商户名长度为3-20个字符!');
*/
function Field_Check(p,str,notice){
	if(!p.test(str)){
		A(notice);exit;
	}
}








/*
	### 检测ip地址的格式是否正确
	参一：ip   要检测的内容
	return 	合法ip返回true ,非法返回false
*/
function ChacekIpFormart(ip){
	if(/^(([0-9])|([1-9][0-9])|([1][0-9]{2})|([2][0-5][0-5]))[.](([0-9])|([1-9][0-9])|([1][0-9]{2})|([2][0-5][0-5]))[.](([0-9])|([1-9][0-9])|([1][0-9]{2})|([2][0-5][0-5]))[.](([0-9])|([1-9][0-9])|([1][0-9]{2})|([2][0-5][0-5]))$/.test(ip)){
		return true;
	}else{
		return false;
	}
}









/*
	### 表单选择并读取文件，如是图片并显示
	参一：文件选择表单项的id
	参二：要显示图片的元素id,如果为空则不显示图片
	参三：回调(返回file或'err')
	示例：
		<input type='file' id='a' />
		<img src='' id='b' />
		SelectOrViewImg('a','b',function(f){
			alert(f);
		});
*/
function SelectOrViewImg(file_input_id,view_id,fun){
	var StoreMain_File = document.getElementById(file_input_id);
	var view_ele = document.getElementById(view_id);
	StoreMain_File.onchange=function(){
		var file = StoreMain_File.files[0];
		var reader = new FileReader();
		reader.onloadend = function(){
			if(view_id){	//如果指定了图片显示元素，则显示图片
				view_ele.src = reader.result;
			}
		}
		if(file){
			reader.readAsDataURL(file);
			fun(file);
		}else{
			fun('err');
		}
	};
}












/*
	### 检测并替换字串中的特殊字符为实体字符 (' , " , > , < , / , \)
	### 参一：源字串 
	### 参二：是否反解析,及分割特殊字符与数值
				空 为特殊字符转实体  默认
				1  为实体转字符
				1+ 将实体字符与数值的分割。如 &#392143 会产生乱码，分割为 &#39 2143
	### return : 返回替换后的字串
	### 示例：
		var content = $('textarea[name=content]').val().trim();
		content = ChangeChar(content);
		或
		ChangeChar(obj.info_title,1)
*/
function ChangeChar(val,stat){
	if(stat){
		if(stat > 1){
			if(/&#[0-9]{2,}/.test(val)){
				var p2 = /([^&#]*)(&#[0-9]{2})([0-9].*)/g;
				var val =  val.replace(p2,"$1$2 $3");
			}
			return val;
		}

		var p2 = /&#60/g;
		val = val.replace(p2,"<");
		var p2 = /&#62/g;
		val = val.replace(p2,">");
		var p2 = /&#39/g;
		val = val.replace(p2,"'");
		var p2 = /&#34/g;
		val = val.replace(p2,'"');
		var p2 = /&#47/g;
		val = val.replace(p2,"\/");
		var p2 = /&#92/g;
		val = val.replace(p2,"\\");
		var p2 = /&#59/g;
		val = val.replace(p2,";");
		var p2 = /&#40/g;
		val = val.replace(p2,"(");
		var p2 = /&#41/g;
		val = val.replace(p2,")");
		//var p2 = /&nbsp/g;
		//val = val.replace(p2," ");
		return val;
	}else{
		var p2 = /</g;
		val = val.replace(p2,"&#60");
		var p2 = />/g;
		val = val.replace(p2,"&#62");
		var p2 = /\'/g;
		val = val.replace(p2,"&#39");
		var p2 = /\"/g;
		val = val.replace(p2,"&#34");
		var p2 = /\//g;
		val = val.replace(p2,"&#47");
		var p2 = /\\/g;
		val = val.replace(p2,"&#92");
		var p2 = /;/g;
		val = val.replace(p2,"&#59");
		var p2 = /\(/g;
		val = val.replace(p2,"&#40");
		var p2 = /\)/g;
		val = val.replace(p2,"&#41");
		//var p2 = / /g;
		//val = val.replace(p2,"&nbsp");
		return val;
	}
}













/*
	###   ajax 异步加载 (JS方式)
	参一：formData(object)  FormData格式数据
	参二：url(string)       请求的地址
	参三：fun(function) 	回调函数
	参四：sync(bool)        是否同步(默认false为异步，true为同步)
	参五：type(bool)		请求方式(默认false为GET,true为POST) 注：GET方式传输数据需要在url中传递，不可使用formData
	示例：
		var formData = new FormData();
		formData.append('file','aaaaa');
		Ajax_FormData(formData,'a.php',function(res){
			alert(res);
			if(/aaa/.test(res)){
				alert(1);
			}else{
				alert(2);
			}
		},true,1);
*/
function Ajax_FormData(formData,url,fun,sync,type){
	if(!sync){
		var sync = true;	//true为异步,false 为同步
	}else{
		var sync = false;
	}
	if(!type){
		var type = 'GET';	//默认为GET方式
	}else{
		var type = 'POST';
	}
	if(window.XMLHttpRequest){
	  var ajax=new XMLHttpRequest();
	}else{
	  var ajax=new ActiveXObject("Microsoft.XMLHTTP");
	}
	ajax.open(type,url,sync);  
	if(!formData){
		ajax.send();
	}else{
		ajax.send(formData);
	}
	if(sync){
		ajax.onreadystatechange=function(){ //监听状态
			if(ajax.readyState==4 && ajax.status == 200){
				fun(ajax.responseText);
			}
		}
	}else{
		fun(ajax.response);
	}
}













/*
	###   ajax 异步加载 (JQUERY方式)
	参一：要传送的数据
	参二：成功回调
	参三：请求的后台地址
	参四：是否异步.当无值时默认为异步，当有值时为同步
	参五：提交方式 默认为post,有值为get
	示例：
		var data = {
					token:t,
					type:type,
					openid:openid
				};

		 Ajax(data,function(res){
		 	alert(res);
		 });
		 或
		 },1);
*/
function Ajax(data,fun,url,async,stat){
	if(!stat){
		stat = 'post';
	}else{
		stat = 'get';
	}
	async = async?false:true;
	if(!url){
		url = 'interface.php';
	}
	$.ajax({
		url:url,
		type:stat,
		async:async,
		data:data,
		success(rq_res,rq_stat,rq_xhr){
			fun(rq_res,rq_stat,rq_xhr);
		},
		error(){
			fun('false');
		}
	});
}









/*
	### 获取数据 (sess -> cache -> after)
	参一：data  object      后参请求参数 ,注：data.method 是区分请求类型的。默认无值为post,有值为get
	参二：fun   function    回调函数
	参三：after_url  string      后台请求地址
	参四：SessName   string      sess缓存名，必须 local_ 或 sess_ 开头，代表两种缓存方式。空为不设置sess缓存
	参五：cache string      静态缓存地址，以http://开头为跨域缓存地址。空为不设置静态缓存
	参六：cache_expire  int       跨域请求时的最大超时。默认2000 为2秒
	参七：cache_callback    string      跨域回调名,默认空为：Gets
	示例：

		//localStorage.local_a1 = '';
		//sessionStorage.sess_a1 = '';	//黑窑sess缓存，以便从静态或后台获取数据

		var data = {'type':'test'};	//后台请求附带的对象数据

		var after_url = '';
		var after_url = 'interface.php';	//后台请求地址

		var cache = '';			// 不使用静态缓存
		var cache = 'test2.html'; //本地
		var cache = 'http://shop-cache-upyun.bm123.top/test/test22.html'; //跨域

		var cache_expire =1000;	//跨域超时为5秒

		var SessName = 'local_a1';	
		var SessName = ""; 				//不使用sess
		var SessName = 'sess_a1';

		Notice('请稍候...');
		sca(data,function(res){
			C(res);
			Notice();
		},after_url,SessName,cache,cache_expire);
*/
function sca(data,fun,after_url,SessName,cache,cache_expire,cache_callback){
	cache_expire = cache_expire?cache_expire:2000;
	cache_callback = cache_callback?cache_callback:'Gets';
	var res = false;
	if(!after_url && !SessName && !cache){
		fun(res);
		return;
	}
	
	if(SessName){
		if(/^sess_.*$/.test(SessName)){ 	//使用sessionStore
			var s_type = 'sess';
			var s_name = 'sessionStorage.'+SessName;
		}else{								//使用localStore
			var s_type = 'local';
			var s_name = 'localStorage.'+SessName;
		}
		var s_name_save = s_name + '= res2;'
		C(data.type+'_'+s_type);
		if(eval(s_name)){
			res = eval(s_name);
		}
	}

	if(res != false){
		fun(res);
		return;
	}
	if(cache && after_url){
		if(/^http:.*$/.test(cache)){	//跨域请求缓存
			//C(cache_callback);return;
			CorsQuery(cache,cache_callback,function(res2){
				C(data.type+'_cache_cors');
				if(res2 != 'err'){
					res2 = JSON.stringify(res2);
					if(SessName){
						eval(s_name_save);
					}
					fun(res2);
				}else{
					sca2();
				}
			},cache_expire);
		}else{							//本地请求缓存
			Ajax({},function(res2){
				C(data.type+'_cache');
				if(res2 != 'false'){
					if(SessName ){
						eval(s_name_save);
					}
					res = res2;
					fun(res);
				}else{
					sca2();
				}
			},cache,1,1);
		}
	}else if(cache){
		if(/^http:.*$/.test(cache)){	//跨域请求缓存
			CorsQuery(cache,cache_callback,function(res2){
				C(data.type+'_cache_cors');
				if(res2 != 'err'){
					res2 = JSON.stringify(res2);
					if(SessName){
						eval(s_name_save);
					}
				}
				fun(res2);
			},cache_expire);
		}else{							//本地请求缓存
			Ajax({},function(res2){
				C(data.type+'_cache');
				if(res2 != 'false'){
					if(SessName ){
						eval(s_name_save);
					}
					res = res2;
				}
				fun(res);
			},cache,1,1);
		}
	}else if(after_url){
		sca2();
	}
	
	function sca2(){
		var method = data.method?1:0;
		Ajax2(data,function(res2){
			C(data.type+'_after');
			if(SessName){
				eval(s_name_save);
			}
			fun(res2);
		},after_url,1,method);	
	}
}




















/*
	### 指定DOM元素全部图片懒加载方式(适用图片不多的情况)
	参一：指定的元素id名
	参二：默认获取srcs属性，可另行指定
	示例：
		Img_Later_View3('#Collect_List1');
*/
function Img_Later_View3(ele,srcs){
	if(!srcs){
		var srcs = 'srcs';
	}
	$(ele).find('img').each(function(i,o){
		if($(o).attr('srcs')){
			$(o).attr('src',$(o).attr(srcs));
		}
	});
}





/*
	### 页面图片懒加载(页面滚动触发式，适用图片较多的页面)
	    无参，无返回值
	示例：
		Img_Later_View(300); //直接调用函数即可	
*/
function Img_Later_View2(height){
  height = height?parseInt(height):150;
  //将所有图片元素存入临时变量中
  var DocumentImgList = document.images;

  Document_View_Img();
  
  //滚动事件触发判断加载图片函数
  $(document).scroll(function(){
  	if(DocumentImgList.length > 0){
  		Document_View_Img();
  	}
  });
  
  //判断加载图片函数
  function Document_View_Img(){
  	for(var i=0;i<DocumentImgList.length;i++){
  	  var eh = DocumentImgList[i].getBoundingClientRect().top;
	  //获取每个元素与可视区域顶部距离
  	  var ch = parseInt(document.body.clientHeight) + height;
	  //获取可视区域高度并额外加上一些高度
  	  if(eh < ch){	//判断元素暴露在可视区中即加载
  	  	$(DocumentImgList[i]).attr('src',$(DocumentImgList[i]).attr('srcs'));
  	  	delete DocumentImgList[i];
  	  }
  	}
  }
}










/*
    ### 无限分页最新(无总页，效率分页*推荐*)
        参一：当前页
        参二：允许显示最大页码
        参三：成功的回调函数
        参四：>> 后翻的最大页码 (对应后台 $max_page)
        参五：当前页前后各显示的页数
		参六：指定要填充的元素id
        需要一个id为 fpage 的容器元素 如 <div style="text-align:center;margin:20px" id="fpage"> </div>
        示例：
			var max_page = MainGoods_Max?MainGoods_Max:MainGoods_Pnow+1;
			Fpage(MainGoods_Pnow,max_page,function(p){
				MainGoods_Pnow = p;
				MainGoods_GetGoodsList();
			},1,1,'#MainGoods_GoodsFpage');
*/
function Fpage(PageNo,max_page,fun,step,loop,ele) {
	if(!loop){
		loop=2;
	}
	if(!step){
		step=6;
	}
	PageNo = parseInt(PageNo);
    var start = PageNo - loop;
    if (start < 1) {
        start = 1;
    }
    var end = PageNo + loop;
    if(end > max_page){
    	end = max_page;
    }
    var fpage_str = '';
	if(PageNo > (loop+1)){
		fpage_str += "<a style='margin:5px;border:1px solid;padding:3px 5px;color:#aaa' PageNo='1' >首页</a>";
	}
    for (var i = start; i <= end; i++) {

        if (PageNo == i) {
            fpage_str += "<a style='margin:5px;border:1px solid blue;padding:3px 5px;color:#fff;background:blue' PageNo=" + i + ">" + i + "</a>";
        } else {
            fpage_str += "<a style='margin:5px;border:1px solid;padding:3px 5px;color:#aaa' PageNo=" + i + ">" + i + "</a>";
        }
    }
    var next = PageNo + step;
    if(next >= max_page){
    	next = max_page
    }
    //console.log(max_page);
	if(PageNo < max_page){
		fpage_str += "<a style='margin:5px;border:1px solid;padding:3px 5px;color:#aaa' PageNo="+next+" >>></a>";
	}
	if(!ele){
		ele = '#fpage';
	}
	$(ele).html(fpage_str);
    $(ele+" a").click(function () {
    	if(PageNo == $(this).attr('PageNo')){
    		return;
    	}
        PageNo = $(this).attr('PageNo');
        fun(PageNo);
    });
}











function C(res){
	console.log(res);
}

function A(res){
	alert(res);
}





